import Taro from '@tarojs/taro'
import { User } from '../types'
import { CloudDataManager } from './cloud'

// 微信登录接口返回的数据结构
interface WechatLoginResult {
  code: string
  errMsg: string
}

// 微信用户信息接口返回的数据结构
interface WechatUserInfo {
  userInfo: {
    nickName: string
    avatarUrl: string
    gender: number
    country: string
    province: string
    city: string
    language: string
  }
  rawData: string
  signature: string
  encryptedData: string
  iv: string
  cloudID: string
}

// 微信登录类
export class WechatAuth {
  /**
   * 微信登录
   * @returns Promise<string> 返回登录code
   */
  static async login(): Promise<string> {
    try {
      const result: WechatLoginResult = await Taro.login()
      if (result.errMsg === 'login:ok') {
        return result.code
      } else {
        throw new Error('微信登录失败')
      }
    } catch (error) {
      console.error('微信登录错误:', error)
      throw error
    }
  }

  /**
   * 获取用户信息
   * @returns Promise<WechatUserInfo>
   */
  static async getUserInfo(): Promise<WechatUserInfo> {
    try {
      const result = await Taro.getUserProfile({
        desc: '用于完善用户资料'
      })
      return result as WechatUserInfo
    } catch (error) {
      console.error('获取用户信息错误:', error)
      throw error
    }
  }

  /**
   * 检查用户是否已授权
   * @returns Promise<boolean>
   */
  static async checkUserAuth(): Promise<boolean> {
    try {
      const setting = await Taro.getSetting()
      return setting.authSetting['scope.userInfo'] || false
    } catch (error) {
      console.error('检查用户授权错误:', error)
      return false
    }
  }

  /**
   * 将微信用户信息转换为应用用户信息
   * @param wechatUserInfo 微信用户信息
   * @param role 用户角色
   * @returns User
   */
  static convertToAppUser(wechatUserInfo: WechatUserInfo, role: 'chef' | 'guest' = 'guest'): User {
    return {
      id: `wx_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
      name: wechatUserInfo.userInfo.nickName,
      role,
      points: 0,
      avatar: wechatUserInfo.userInfo.avatarUrl,
      createdAt: new Date()
    }
  }

  /**
   * 完整的微信登录流程（集成云开发）
   * @param role 用户角色
   * @returns Promise<User>
   */
  static async fullLogin(role: 'chef' | 'guest' = 'guest'): Promise<User> {
    try {
      // 1. 微信登录获取code
      const code = await this.login()
      console.log('微信登录成功，code:', code)

      // 2. 获取用户信息
      const userInfo = await this.getUserInfo()
      console.log('获取用户信息成功:', userInfo)

      // 3. 转换为应用用户信息
      const appUser = this.convertToAppUser(userInfo, role)

      // 4. 调用云函数进行登录验证（可选）
      // const cloudResult = await this.callCloudLogin(code, appUser)
      
      // 5. 保存用户到云数据库
      const userId = await CloudDataManager.saveUser(appUser)
      appUser.id = userId

      return appUser
    } catch (error) {
      console.error('微信登录流程失败:', error)
      throw error
    }
  }

  /**
   * 调用云函数进行登录验证
   * @param code 微信登录code
   * @param userInfo 用户信息
   * @returns Promise<any>
   */
  static async callCloudLogin(code: string, userInfo: User): Promise<any> {
    try {
      const result = await Taro.cloud.callFunction({
        name: 'login',
        data: {
          code,
          userInfo
        }
      })
      return result.result
    } catch (error) {
      console.error('调用云函数失败:', error)
      throw error
    }
  }

  /**
   * 发送code到云函数（使用微信云开发）
   * @param code 微信登录code
   * @param userInfo 用户信息
   * @returns Promise<any>
   */
  static async sendCodeToServer(code: string, userInfo: User): Promise<any> {
    try {
      // 调用云函数处理登录
      const result = await Taro.cloud.callFunction({
        name: 'login', // 云函数名称
        data: {
          code,
          userInfo
        }
      })
      
      // 类型安全检查
      if (result.result && typeof result.result === 'object') {
        const response = result.result as any
        if (response.success) {
          return response.data
        } else {
          throw new Error(response.error || '登录失败')
        }
      } else {
        throw new Error('云函数返回格式错误')
      }
    } catch (error) {
      console.error('调用登录云函数失败:', error)
      throw error
    }
  }
}

// 导出工具函数
export const wechatUtils = {
  login: WechatAuth.login,
  getUserInfo: WechatAuth.getUserInfo,
  checkUserAuth: WechatAuth.checkUserAuth,
  fullLogin: WechatAuth.fullLogin
} 